

package com.base.commons.tools.validator;


import com.base.commons.tools.exception.ParamException;
import com.base.commons.tools.exception.BaseOfException;
import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

/**
 * hibernate-validator校验工具类
 * 参考文档：http://docs.jboss.org/hibernate/validator/6.0/reference/en-US/html_single/
 *
 * @author carl
 * @since 1.0.0
 */
public class ValidatorUtils {
    private static Map<String,Validator> map=new HashMap<>();

    static {
        map.put("en-US",getValidatorByLocale(Locale.US));
        map.put("zh-CN",getValidatorByLocale(Locale.CHINA));
    }

    private static ResourceBundleMessageSource getMessageSource() {
        ResourceBundleMessageSource bundleMessageSource = new ResourceBundleMessageSource();
        bundleMessageSource.setDefaultEncoding("UTF-8");
        bundleMessageSource.setBasenames("i18n/messages_common", "i18n/validation_common");
        return bundleMessageSource;
    }

//    /**
//     * 校验对象
//     * @param object        待校验对象
//     * @param groups        待校验的组
//     * @throws BaseOfException  校验不通过，则报RenException异常
//     */
//    public static void validateEntity(Object object, Class<?>... groups)
//            throws BaseOfException {
//        Set<ConstraintViolation<Object>> constraintViolations = map.get(LocaleContextHolder.getLocale().toLanguageTag()).validate(object, groups);
//        if (!constraintViolations.isEmpty()) {
//        	ConstraintViolation<Object> constraint = constraintViolations.iterator().next();
//            throw new BaseOfException(400,constraint.getMessage());
//        }
//    }
    public static Validator getValidatorByLocale(Locale locale) {
        Locale.setDefault(locale);
        Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(
                new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource())))
                .buildValidatorFactory()
                .getValidator();
        return validator;
    }

    /**
     * 校验对象
     * @param object        待校验对象
     * @param groups        待校验的组
     * @throws BaseOfException  校验不通过，则报ZtException异常
     */
    public static void validateEntity(Object object, Class<?>... groups)
            throws ParamException {
        //Locale.setDefault(LocaleContextHolder.getLocale());
//        Validator validator = Validation.byDefaultProvider().configure().messageInterpolator(
//                new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(getMessageSource())))
//                .buildValidatorFactory().getValidator();
//
///        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);
        Validator validator=map.get(LocaleContextHolder.getLocale().toLanguageTag());
         if(validator==null){
             //最好不要走这个分支不然有性能开销
             validator=getValidatorByLocale(LocaleContextHolder.getLocale());
         }
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(object, groups);

        if (!constraintViolations.isEmpty()) {
            ConstraintViolation<Object> constraint = constraintViolations.iterator().next();
            throw new ParamException(400,constraint.getMessage());
        }
    }

}